package org.safaproject.server.dao;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.SessionFactory;
import org.safaproject.server.constants.ConfigurationConstants;
import org.safaproject.server.model.Archivo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.transaction.annotation.Transactional;

@Transactional(rollbackFor = Exception.class)
public class ArchivoDAO extends HibernateDaoSupport {

	private static Log logger = LogFactory.getLog(ArchivoDAO.class);

	@Autowired
	public void initSessionFactory(SessionFactory factory) {
		setSessionFactory(factory);
	}

	public Archivo getArchivoById(String idArchivo) {
		return (Archivo) super.getHibernateTemplate().load(Archivo.class,
				idArchivo);
	}

	public String saveArchivo(Archivo archivo) {

		// TODO Es responsabilidad de la ui guardar el archivo al fileSystem.

		super.getHibernateTemplate().save(archivo);
		return archivo.getIdArchivo();
	}

	public String updateApunte(Archivo archivoViejo, Archivo archivoNuevo) {

		// TODO Es responsabilidad de la ui guardar el archivo al fileSystem.

		//Borramos el archivo viejo del fs y la base
		Archivo viejo = getArchivoById(archivoViejo.getIdArchivo());
		borrarArchivo(viejo.getFilePath());
		deleteArchivo(viejo);

		// TODO También acordarse que a nivel service, habría que
		// actualizar el id del apunte

		//Damos de alta el archivo nuevo en la base
		super.getHibernateTemplate().update(archivoNuevo);
		return archivoNuevo.getIdArchivo();
	}

	public void deleteArchivo(Archivo archivo) {
		super.getHibernateTemplate().delete(archivo);
		
	}

	private void borrarArchivo(String filePath) {

		File fichero = new File(filePath);

		if (fichero.delete())
			logger.info("Se ha borrado el archivo " + filePath);
		else
			logger.info("Error al borrar el archivo " + filePath);

	}
	
	// Callback method to begin receiving the upload.
	public OutputStream receiveUpload(String filename, String MIMEType) throws FileNotFoundException {
		FileOutputStream fos = null;
		File file = new File(ConfigurationConstants.UPLOAD_PATH + filename);
		fos = new FileOutputStream(file);
		return fos;
	}

}
